package mensagens;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.LinkedList;

import o2b.IStream;
import o2b.MarshallableException;
import cliente.tipos.Conta;
import cliente.tipos.ItemConta;

public class ManterConta extends Mensagem{
	private Conta c;
	
	private int NumAp;
	
	/**
	 * 1 - Buscar conta
	 *  11 - Buscar Conta OK
	 *  12 - Falha na busca da conta
	 */
	private int subTipo;
	
	/**
	 * Construtor Padrão
	 */
	public ManterConta() {
		tipo = TipoMensagem.MANTERCONTA;
		setC(new Conta());
		setSubTipo(0);
	}
	
	/**
	 * Construtor de mensagem específica
	 * @param subtipo 1 - Buscar conta
	 *  11 - Buscar Conta OK
	 *  12 - Falha na busca da conta
	 */
	public ManterConta(int subtipo) {
		tipo = TipoMensagem.MANTERCONTA;
		setC(new Conta());
		setSubTipo(subtipo);
	}
	
	@Override
	public void marshal(IStream stream) throws MarshallableException {
		super.marshal(stream); 					// Envia o tipo da mensagem
		stream.write(getSubTipo());				// Envia o subtipo da mensagem
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");	// Cria um formatador de data
		
		// Avalia o subtipo da mensagem, para saber o que enviar
		/**
		 * 1 - Buscar conta
		 *  11 - Buscar Conta OK
		 *  12 - Falha na busca da conta
		 */
		switch(getSubTipo()){
			case 1:
				// Envia o número do apartamento
				stream.write(getNumAp());
				break;
				
			case 11:
				// Envia os dados da conta
				
				// Primeiro a quantidade de itens:
				stream.write(c.getItens().size());
				// Agora envia todos, um a um
				for (int l = 0; l < c.getItens().size(); l++){
					// Envia a descrição do serviço
					stream.write(c.getItens().get(l).getServico().getDescricao());
					// Envia a data
					stream.write(sdf.format(c.getItens().get(l).getData()));
					// Envia a quantidade
					stream.write(c.getItens().get(l).getQuantidade());
					// Envia o valor
					stream.write(c.getItens().get(l).getValor());
				}
				break;
				
			default:
				break;
		}
	}
	
	@Override
	public void unmarshal(IStream stream) throws MarshallableException {
		// Extrai o subtipo da mensagem
		setSubTipo(stream.readInt());
		
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");	// Cria um formatador de data
		
		// Trata o subtipo da mensagem
		/**
		 * 1 - Buscar conta
		 *  11 - Buscar Conta OK
		 *  12 - Falha na busca da conta
		 */
		switch(getSubTipo()){
		case 1:
			setNumAp(stream.readInt());
			break;
			
		case 11:
			// Lê o tamanho da lista de itens da conta
			int tam = stream.readInt();
			// Cria uma lista de itens para receber os dados
			LinkedList<ItemConta> list = new LinkedList<ItemConta>();
			// Lê cada item enviado
			for (int k = 0; k < tam; k++){
				
				ItemConta i = new ItemConta();
				
				// Lê a descrição do serviço
				i.getServico().setDescricao((String)stream.readObject());
				
				// Lê a data
				try {
					i.setData(sdf.parse((String)stream.readObject()));
				} catch (ParseException e) {
					e.printStackTrace();
				}
				
				// Lê a quantidade
				i.setQuantidade(stream.readInt());
				
				// Lê o valor
				i.setValor(stream.readDouble());
				
				list.add(i);
			}
			
			getC().setItens(list);
			break;
			
		default:
			break;
		
		}
	}

	public Conta getC() {
		return c;
	}

	public void setC(Conta conta) {
		this.c = conta;
	}
	/**
	 * 
	 * @return 1 - Buscar conta
	 *  11 - Buscar Conta OK
	 *  12 - Falha na busca da conta
	 */
	public int getSubTipo() {
		return subTipo;
	}

	public void setSubTipo(int subTipo) {
		this.subTipo = subTipo;
	}

	public void setNumAp(int numAp) {
		NumAp = numAp;
	}

	public int getNumAp() {
		return NumAp;
	}


}
